package com.ruoyi.bill.mapper;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

import com.ruoyi.bill.domain.*;
import org.apache.ibatis.annotations.Param;

/**
 * 单据管理Mapper接口
 *
 * @author nexiaozi
 * @date 2022-02-19
 */
public interface ZnDepotHeadMapper
{
    /**
     * 查询单据管理
     *
     * @param id 单据管理主键
     * @return 单据管理
     */
    public ZnDepotHead selectZnDepotHeadById(Long id);

    /**
     * 查询单据管理列表
     *
     * @param znDepotHead 单据管理
     * @return 单据管理集合
     */
    public List<ZnDepotHead> selectZnDepotHeadList(ZnDepotHead znDepotHead);

    /**
     * 新增单据管理
     *
     * @param znDepotHead 单据管理
     * @return 结果
     */
    public int insertZnDepotHead(ZnDepotHead znDepotHead);

    /**
     * 修改单据管理
     *
     * @param znDepotHead 单据管理
     * @return 结果
     */
    public int updateZnDepotHead(ZnDepotHead znDepotHead);

    /**
     * 删除单据管理
     *
     * @param id 单据管理主键
     * @return 结果
     */
    public int deleteZnDepotHeadById(Long id);

    /**
     * 批量删除单据管理
     *
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteZnDepotHeadByIds(Long[] ids);

    /**
     * 批量删除单据子
     *
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteZnDepotItemByHeaderIds(Long[] ids);

    /**
     * 批量新增单据子
     *
     * @param znDepotItemList 单据子列表
     * @return 结果
     */
    public int batchZnDepotItem(List<ZnDepotItem> znDepotItemList);


    /**
     * 通过单据管理主键删除单据子信息(物理删除)
     *
     * @param id 单据管理ID
     * @return 结果
     */
    public int deleteZnDepotItemByHeaderId(Long id);

    /**
     * 通过单据管理主键删除单据子信息(逻辑删除)
     *
     * @param id 单据管理ID
     * @return 结果
     */
    public int  deleteFlagZnDepotItemByHeaderId(Long id);
    /**
     * 修改单据信息状态
     * @param status 状态 1 审核 0 反审核
     * @param ids 单据主键
     * @author nexiaozi
     * @date 2022年2月20日
     */
    public int changeStatus(@Param("ids") Long[] ids, @Param("status") String status);

    /**
     * 查询记录数
     * @param znDepotHead
     * @return
     */
    public int  selectZnDepotHeadCount(ZnDepotHead znDepotHead);

    List<ZnDepotHead> selectZnDepotHeadByDate(ZnDepotHead znDepotHeadQuery);

    /**
     *
     * @param type 订单类型（出库、入库）
     * @param materialParam 商品信息
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param tenantId 租户Id
     * @return
     */
    List<DepotItemVo4WithInfoEx> selectZnDepotHeadPage(@Param("type")String type, @Param("materialParam") String materialParam, @Param("startTime") String startTime,@Param("endTime") String endTime, @Param("tenantId") Long tenantId);

    BigDecimal buyOrSaleNumber(
            @Param("type") String type,
            @Param("subType") String subType,
            @Param("MId") Long MId,
            @Param("beginTime") String beginTime,
            @Param("endTime") String endTime,
            @Param("sumType") String sumType,
            @Param("tenantId") Long tenantId);

    BigDecimal buyOrSalePrice(
            @Param("type") String type,
            @Param("subType") String subType,
            @Param("MId") Long MId,
            @Param("beginTime") String beginTime,
            @Param("endTime") String endTime,
            @Param("sumType") String sumType,
            @Param("tenantId") Long tenantId);

    List<DepotHeadVo4InDetail> findByAll(@Param("beginTime") String beginTime,
                                         @Param("endTime") String endTime,
                                         @Param("type") String type,
                                         @Param("materialParam") String materialParam,
                                         @Param("depotList") List<Long> depotList,
                                         @Param("oId") Long oId,
                                         @Param("number") String number,@Param("status") String status, @Param("tenantId") Long tenantId);

    List<DepotHeadVo4InDetail> findAllocationDetail(@Param("beginTime") String beginTime,
                                                    @Param("endTime") String endTime,
                                                    @Param("subType") String subType,
                                                    @Param("number") String number,
                                                    @Param("materialParam") String materialParam,
                                                    @Param("depotList") List<Long> depotList,
                                                    @Param("depotFList") List<Long> depotFList,  @Param("tenantId") Long tenantId);

    List<DepotHeadVo4InOutMCount> findInOutMaterialCount(
            @Param("beginTime") String beginTime,
            @Param("endTime") String endTime,
            @Param("type") String type,
            @Param("materialParam") String materialParam,
            @Param("depotList") List<Long> depotList,
            @Param("oId") Long oId,  @Param("tenantId") Long tenantId);

    List<DepotItemVo4WithInfoEx> findInOutStockReport(@Param("materialParam") String materialParam,
                                                      @Param("endTime") String endTime,
                                                      @Param("tenantId") Long tenantId);

    BigDecimal getStockCheckSumByDepotList( @Param("depotList") List<Long> depotList,
                                            @Param("mId") Long mId,
                                            @Param("beginTime") String beginTime,
                                            @Param("endTime") String endTime);

    DepotItemVo4Stock getStockByParamWithDepotList( @Param("depotList") List<Long> depotList,
                                                    @Param("mId") Long mId,
                                                    @Param("beginTime") String beginTime,
                                                    @Param("endTime") String endTime);

    List<DepotHeadVo4StatementAccount> findStatementAccount(@Param("beginTime") String beginTime,
                                                            @Param("endTime") String endTime,
                                                            @Param("organId") Long organId,
                                                            @Param("supType") String supType, @Param("tenantId")Long tenantId);

    BigDecimal findAllOtherMoney( @Param("supplierId") Long supplierId,
                                  @Param("type") String type,
                                  @Param("subType") String subType,
                                  @Param("endTime") String endTime);

    BigDecimal findAllMoney(@Param("supplierId") Long supplierId,
                            @Param("type") String type,
                            @Param("subType") String subType,
                            @Param("modeName") String modeName,
                            @Param("endTime") String endTime);

    List<DepotItemStockWarningCount> findStockWarningCount(
            @Param("materialParam") String materialParam,
            @Param("depotList") List<Long> depotList);

    List<DepotItemVo4DetailByTypeAndMId> findDetailByTypeAndMaterialIdList( @Param("mId") Long mId);

    List<ZnDepotItem> selectZnDepotItemList(ZnDepotItem znDepotItem);

    List<DepotItemVo4DetailByTypeAndMId> findDetailByTypeAndMaterialIdList( @Param("mId") Long mId,@Param("tenantId")Long tenantId);

    List<DepotHeadVo4List> getDetailByNumber(@Param("number") String number,@Param("tenantId")Long tenantId);

    String findMaterialsListByHeaderId(Long id);

    List<DepotItemVo4WithInfoEx> getDetailList(  @Param("headerId") Long headerId);

    DepotItemVo4Stock getSkuStockByParam(@Param("depotId") Long depotId,
                                         @Param("meId") Long meId,
                                         @Param("beginTime") String beginTime,
                                         @Param("endTime") String endTime);

    BigDecimal getFinishNumber(  @Param("mId") Long mId,
                                 @Param("linkNumber") String linkNumber,
                                 @Param("goToType") String goToType);

    /**
     * 通过订单号更新状态（將訂單狀態變為已完成）
     * @param update
     * @return
     */
    int updateOrderStatusByNumber(ZnDepotHead update);

    /**
     * 通過ids更新有關聯訂單的状态（將訂單狀態變為已審核）
     * @param ids
     * @return
     */
    int updateOrderStatusByIds(@Param("ids") Long[] ids);
    /**
     * 查询订单商品列表，仅有导出字段
     * @param id
     * @return
     */
    List<ZnDepotItemExportTemplate> selectExportZnDepotItemByHeadId(Long id);

    List<ZnDepotItemExportTemplate> selectExportZnDepotItemByHeadIds(List<Long> headIds);


    Map<String,Object> selectReport(@Param("type")int type,@Param("tenantId")Long tenantId);

    List<Map<String, Object>> selectLastSixMonthReport(@Param("tenantId")Long tenantId);

    List<MaterialIOVo> selectMaterialPurchaseInList(ZnDepotHead queryParam);

    List<DepotItemVo4DetailByTypeAndMId> findDetailByTypeAndMaterialIdList(@Param("mId")Long mId,@Param("billNo") String billNo,@Param("type") String type,@Param("subType") String subType,@Param("beginOperTime") String beginOperTime,@Param("endOperTime") String endOperTime,@Param("tenantId") Long tenantId);

    List<Map<String, Object>> selectMaterialInOutTotal(ZnDepotItem znDepotItem);

    List<Map<String, Object>> selectZnDepotItemErrorList();

//    List<ZnDepotHead> selectZnDepotHeadDebtList(ZnDepotHead znDepotHead);
}
